« 前へ | Articles
トップへ | 次へ »
IDA Pro入門 - IDA Proを使ったデバッグについて -
2019.02.01
IDA
Proを使ったデバッグ方法
前回が実行可能ファイルをIDA Proに読み込ませて、その際にどのようなウィンドウがあるのかなどの説明をしました。今回は、基本的なデバッグの設定であったり、デバッグをする際に使える便利な機能などについて説明していきたいと思います。
デバッグする上での注意事項
デバッグをする際、実行可能ファイルに含まれる命令を実際に実行しながら解析を進めることになります。そのため、解析対象の実行可能ファイルがマルウェアの場合には、不正なコードを実行することになります。
なので、IDAなどデバッガを使用してマルウェアを解析する際には、仮想環境や隔離された解析環境を用いて、その中でデバッグを行ってください
1. ブレークポイントの設定と実行
ブレークポイントをはり、任意の場所で処理を一時停止させることが可能です。ブレークポイントを有効に活用することで、「自分の解析したい場所まで処理を進め、解析したい部分に集中する」ことが可能です。
IDAでは、2種類のブレークポイントのはり方があります。
·
・ソフトウェアブレークポイント
·
・ハードウェアブレークポイント
一般的によく用いられており、ツール内に実装されているのは「ソフトウェアブレークポイント」になります。
ソフトウェアブレークポイントによってどのように処理が一時停止するのかについては、以前掲載したマルウェアの解析記事(https://cyberforensic.focus-s.com/support/963/)に内容がありますので、そちらを参照していただければと思います。
また、もう一つの「ハードウェアブレークポイント」は、CPU内のデバッグレジスタを使用して、処理を一時停止させる方法になります。
ソフトウェアブレークポイントをはる際には、特定の処理の部分で「右クリック」→ 「Add
breakpoints」を選択します。ショートカットキーとしてはF2が用意されていますので、F2を押すことでブレークポイントを設定することもできます。
そうすると、ブレークポイントがセットされた命令部分が赤く塗りつぶされているのがわかるかと思います。
これで、ブレークポイントを貼る作業は完了です。
ハードウェアブレークポイントを貼る際には、一度、ソフトウェアブレークポイントを貼る要領で「右クリック」→「Add breakpoint」またはF2キーを押してブレークポイントを設定します。その後、右クリックメニューで「Edit breakpoint」を選択します。そうすると、ブレークポイントに関して様々な設定を施すことが可能です。
メニューバーのDebuggerからEdit breakpointを選択
breakpointの設定画面
この設定の中で、「Settings」の部分にある「Hardware」というチェックボックスにチェックを付けることで、ハードウェアブレークポイントを使用することが可能になります。ハードウェアブレークポイントに関する設定は、「Hardware breakpoint settings」の部分で行います。
※ハードウェアブレークポイントは、CPU内に存在するデバッグレジスタを使用します。そのため、設定できるハードウェアブレークポイントの個数はCPU内に存在するデバッグレジスタの数に依存します。
ここまででブレークポイントの設定を行いました。自分で設定したブレークポイントの一覧を見る場合には、メニューバーの「Debugger」→「Breakpoint」→「Breakpoint list」をクリックすることで、自分が設定したブレークポイントとその設定内容を確認することが可能になります。
メニューバーからブレークポイントのリストを表示
設定したBreakpointのリスト
また、Breakpointのリストは、Toolbar Areaのボタンからもいけます。Toolbar Areaの「Open Breakpoints window」を選択すると、同様に設定したブレークポイントの一覧を確認することが可能です。
2.
デバッグ実行時の画面
ブレークポイントの設定が完了しましたので、実際に処理を進めていきます。デバッグをする際には、まず、デバッガを選択します。画面上部にProcess Control Panelというものがあります。そこには、再生ボタンや停止ボタンのようなものがあり、その隣にプルダウンでデバッガが選択できる部分があります(Process Control Panelについては、実際にデバッグをしている際にも使用します。それに関しては後ほど)。
デバッガ選択前のProcess Control Panel
まずは、デバッガの選択から。ここでは「Local Windows debugger」を選択します。
デバッガの選択が完了したら、実際にブレークポイントまで処理を進めていきます。Start Processのボタンをクリックすると、実際に処理が開始されます。また、処理の開始にはショートカットキーが用意されています。F9キーを押すことで処理を開始することも可能です。
ただし、処理開始直後に警告のウィンドウが出てきます。
こちらに関しては「実際にプログラムを動作させることになるけど、本当にいいか?」というものになります。特に、解析対象がマルウェアの場合には、取扱に十分注意を払って解析を行うことが必要です。
実行後、設定したブレークポイントまで処理が進んだ場合には、ブレークポイントの部分で処理が中断されます。もしデバッグ作業自体を終了したい場合には、Terminateボタンをクリックします。
ひとまず、Start Processをクリックした直後の画面全体を見てみましょう。すると、いくつか、実行可能ファイルを読み込んだ時点では見れなかった画面が見えるかと思います。どういった画面なのかをみていきたいと思います。
·
・IDA View-EIP
·
・General registers View
·
・Modules View
·
・Threads View
·
・Stack View
·
・Hex View
IDA
View-EIP
基本的には1回目で見ていったDisassembly viewと内容はほぼ同じですが、ブレークポイントが設定されている箇所を確認することができますし、ブレークポイントで停止しているときやステップ実行(後ほど説明いたします)を行っているときに「今どの命令の部分にいるのか」を確認することができます。下の画像では、ちょうどブレークポイントの部分で一時停止している様子を載せています。
また、disassembly viewと同様に、右クリックメニューやspaceキーを押すことによってgraph viewとtext viewの切り替えを行うことができます。
General
registers
処理を行う際に、特定の値などをレジスタに格納していきますが、「特定の命令を実行したあと、レジスタがそれぞれどのような状態になっているか」を確認する際に使用します。
初期設定だとGeneral
registersの画面ですが、「General
regiters」の画面で右クリックメニューを表示させると、「Segment registers」や「FPU registers」というものが確認できます。
また、特定のレジスタをダブルクリックすると、現在レジスタにセットされている値を変更することが可能です。
Modules
View
解析対象のプログラムを実行させた際に、ロードされるモジュール(exeやdllなど)の一覧を確認できる画面となります。
また、特定のexeまたはdllをダブルクリックすると、そのモジュールからエクスポートされた関数の名前などを表示させることができます。
Threads
View
解析対象のプログラムを実行させた際に起動するスレッドを確認する画面になります。マルチスレッドのプログラムの場合、Threadsのリストに複数のスレッドが表示されます。
また、マルチスレッドの場合、特定のスレッドをダブルクリックすると、そのスレッドのレジスタの状態をRegisterウィンドウに表示し、Debug View上ではどこまで処理を行っているのかを表示します。
Nameが「dmyml1.exe」のものを選択している際の画面
Nameが「772DA3F0」のものを選択している際の画面
Stack
View
スタックの状態を表す画面になります。スタックは、アドレスの上位から下位に伸びていくデータ構造になりますが、Stack View上では「上に行くほどアドレスの下位」になり、「下に行くほど上位のアドレス」になります。
また、右クリックメニューからespのアドレスへジャンプしたり(Jump
to ESP)、ebpのアドレスへジャンプすることができます(Jump to EBP)。
3.
デバッグ時の実行制御
一度、ブレークポイントで処理が停止したあとは、その後のコードを1行1行実行して、それぞれの時のレジスタ、スタック、メモリの状態を1つ1つ確認したい場合があります。そういったときには、「ステップ実行」などの実行制御行います。。こういった実行の制御は、Toolbar AreaのProcess Control PanelやメニューバーのDebuggerから行うことができます。
Process Control Panel
メニューバーの「Debugger」で表示される項目
まずステップ実行について。ステップ実行にもいくつか種類があります。
·
・Step into (ショートカットキー:F7)
·
・Step over (ショートカットキー:F8)
これらの違いは、call命令をステップ実行するときに出てきます。
Step intoは、call命令で呼び出されるサブルーチンの内部に入って処理を見ていきます。特定のサブルーチンの処理に注目したいときなどに使用していきます(特に、Windows APIではない関数が用いられているとき。例えばsub_XXXXなどの、独自に定義された関数を使用している場合など)。
Step intoを行う場合には、ブレークポイントで停止した後、以下のいずれかの操作をします。
·
・Process Control Panelの「Step into」のボタンを押す
·
・メニューバーの「Debugger」の「Step into」を選択
·
・ショートカットキーであるF7を押す
一方、Step over は、call命令で呼び出されるサブルーチンの内部には入らず、call命令の次の命令へ進みます。Step over は、call命令によって呼ばれるサブルーチンの処理や戻り値が判明している場合(例えば、Windows APIなどで公開情報により引数や戻り値などが明確である場合や、すでにStep intoで解析を行っていて処理が判明している場合など)に使用していきます。
Step over を行う場合には、ブレークポイントで停止した後、以下のいずれかの操作をします。
·
・Process Control Panelの「Step over」のボタンを押す
·
・メニューバーの「Debugger」の「Step over」を選択
·
・ショートカットキーであるF8を押す
また、ステップ実行と似たようなものにはなりますが、特定の場所まで処理を進めるという機能もあります。
·
・Run to cursor : カーソルで選択した命令まで処理を進める(カーソルで命令を選択後F4)
·
・Run until return : サブルーチンのリターンまで処理を進める(Ctrl+F7)
特定の場所まで処理を進めるという点ではブレークポイントをはるのと同じですが、「ブレークポイントをはるほどではないけれども、ちょっと先まで実行して処理を停止させたい」といったときに便利です。
実行する際には、どちらもメニューバーの「Debugger」から選択します。
現在の関数から呼び出し元に戻るまで実行を行いたい場合には「Run until returns」を選択します。ここで確認できる通り、ショートカットキーはCtrl + F7になります。
自分がカーソルで選択した命令部分まで実行したい場合には「Run to cursor」を選択します。先程同様にショートカットキーはF4になります。
このような機能を使いながら、特定の命令部分で処理を一時停止させたり飛ばしたりして、なるべく注目すべきコードのみを見ていくという形になります。
4.
任意の処理への移動
分岐命令では、特定の条件に合致した場合にのみ処理を行うなどのを行います。IDAのDebug Viewにおいても、Graph Viewを表示させると、ジャンプ命令(jz, jnzなど)の下に色分けされた矢印があり、矢印の先にはそれぞれの処理が書かれています。
通常であれば、「特定の条件に合致している場合(あるフラグが立っているとき)には、こちらの命令へ進む」という流れになるが、「特定の条件には合致していないが、ジャンプ先を意図的に変えたい」場合もあります。そういった場合には、「Set IP」を使って実行先を変更することが可能です。
例えば、以下の画像のように、ジャンプ命令で本来であれば左側に飛ぶ処理があるとします。
左側の処理の先頭の命令が少し濃く塗りつぶされているのがわかるかと思います。何も手を加えず処理を進めると、左側の処理にいきます。
では、手前のジャンプ命令が実行される前に、右側の処理へ移るように設定をしていきます。
移動したい命令の箇所で「右クリック」→「Set IP」を選択します。
Set IPをクリックすると、以下の画像のように、右側の命令部分が濃く塗りつぶされているのがわかるかと思います。
このような形で、「本来の処理で進む方とは異なる処理」をSet IPを使うことによって見ることが可能になります。
IDA Proには、デバッグ時に使用する機能はこれ以外にも多くあります。基本的には、こういった機能を使っていけば解析自体は進めることができます。その他の機能については、Hex-raysのホームページなどを確認していただければと思います。
基本的な操作の説明にはなりますが、今回はここまで。
次回は、decompilerについてやっていこうと思います。